package com.sh.datasync.job;

import com.sh.datasync.util.XmlUtils;
import com.sh.datasync.util.PlmFileScanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.List;
import com.sh.datasync.model.PlmFileData;

/**
 * @Author: seeTools
 * @Date: 2025/6/21  8:38
 * @Version 1.0
 */
@Component
public class DataClassify {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 数据转换（将PLM传来的数据转换为对应的类型）
     * 5分钟执行一次
     */
    @Scheduled(cron = "0 */5 * * * ?")
    public void dataConvertJob() {
        logger.info("@dataConvertJob#in");
        XmlUtils.analysis();
        logger.info("@dataConvertJob#out");
    }

    /**
     * 新增：只负责扫描XML并导出日志，不影响原有功能
     */
    @Scheduled(cron = "0 */5 * * * ?")
    public void scanAndExportLogs() {
        scanAndExport("D:/Eplan_integration/PLM2EPLAN/backup", "backup");
        scanAndExport("D:/Eplan_integration/PLM2EPLAN/error", "error");
    }

    private void scanAndExport(String dirPath, String fileType) {
        File dir = new File(dirPath);
        File[] files = dir.listFiles((d, name) -> name.toLowerCase().endsWith(".xml"));
        if (files == null) {
            logger.info("No XML files found in " + dirPath);
            return;
        }
        for (File xmlFile : files) {
            String logDir = "D:/Eplan_integration/PLM2EPLAN/logs";
            File logFile = new File(logDir, fileType + "_" + xmlFile.getName() + ".log");
            try {
                // 预先检查XML文件的基本有效性
                if (!xmlFile.exists() || xmlFile.length() < 10) {
                    logger.warn("跳过无效的XML文件 (不存在或太小): " + xmlFile.getName());
                    continue;
                }
                
                if (!xmlFile.canRead()) {
                    logger.warn("跳过无法读取的XML文件 (可能被占用): " + xmlFile.getName());
                    continue;
                }
                
                // 检查日志文件是否存在且内容相同
                if (logFile.exists() && isLogContentSame(xmlFile, fileType, logFile)) {
                    logger.info("日志内容相同，跳过写入: " + logFile.getAbsolutePath());
                    continue;
                }
                
                PlmFileScanner.scanAndWriteLog(xmlFile, fileType, logDir);
                logger.info("已导出日志：" + logFile.getAbsolutePath());
                
            } catch (Exception e) {
                logger.warn("XML文件处理失败，跳过该文件: " + xmlFile.getName() + " - " + e.getMessage());
                
                // 对于严重的XML格式错误，建议将文件移动到错误目录
                if (e.getMessage() != null && e.getMessage().contains("XML格式错误")) {
                    logger.warn("建议检查XML文件格式: " + xmlFile.getAbsolutePath());
                    // 可以考虑将损坏的文件移动到专门的错误目录，但这里只记录警告
                }
            }
        }
    }

    /**
     * 比较日志文件内容是否相同（使用内容摘要比较）
     */
    private boolean isLogContentSame(File xmlFile, String fileType, File logFile) {
        try {
            // 解析XML文件获取最新数据
            List<PlmFileData> newData = PlmFileScanner.parseXml(xmlFile, fileType);
            
            // 生成新数据的内容摘要（只比较9个XML字段）
            StringBuilder newContentDigest = new StringBuilder();
            for (PlmFileData data : newData) {
                newContentDigest.append(
                    String.join(" < /dev/null | ",
                        data.getErpCode() == null ? "" : data.getErpCode(),           // PropertyIndex="1"
                        data.getPartNumber() == null ? "" : data.getPartNumber(),     // PropertyIndex="2"
                        data.getCategory() == null ? "" : data.getCategory(),         // PropertyIndex="3"
                        data.getProductGroup() == null ? "" : data.getProductGroup(), // PropertyIndex="4"
                        data.getSubProductGroup() == null ? "" : data.getSubProductGroup(), // PropertyIndex="5"
                        data.getPartName() == null ? "" : data.getPartName(),         // PropertyIndex="6"
                        data.getTypeNumber() == null ? "" : data.getTypeNumber(),     // PropertyIndex="7"
                        data.getTechParam() == null ? "" : data.getTechParam(),       // PropertyIndex="8"
                        data.getDescription() == null ? "" : data.getDescription()    // PropertyIndex="9"
                    )
                ).append("\n");
            }
            
            // 读取现有日志文件并生成内容摘要（只比较9个XML字段）
            StringBuilder existingContentDigest = new StringBuilder();
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(logFile), "UTF-8"))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    if (line.trim().isEmpty()) continue; // 跳过空行
                    String[] fields = line.split("\\|");
                    if (fields.length >= 11) {
                        // 只取第3-11个字段（索引2-10，对应9个XML字段，排除文件名、文件类型和时间）
                        StringBuilder lineDigest = new StringBuilder();
                        for (int i = 2; i < 11; i++) {
                            lineDigest.append(fields[i]);
                            if (i < 10) lineDigest.append("|");
                        }
                        existingContentDigest.append(lineDigest.toString()).append("\n");
                    }
                }
            }
            
            // 比较两个摘要字符串
            String newDigest = newContentDigest.toString().trim();
            String existingDigest = existingContentDigest.toString().trim();
            
            return newDigest.equals(existingDigest);
            
        } catch (Exception e) {
            logger.warn("比较日志内容失败，将重新生成: " + xmlFile.getName() + " - " + e.getMessage());
            return false; // 出错时默认认为不同，重新生成
        }
    }

}
